// call() 方法在使用一个指定的 this 值和若干个指定的参数值的前提下调用某个函数或方法。

/**
 * 1. 将函数设置为对象的属性
 * 2. 调用该属性
 * 3. 删除改属性
 * */ 


// 第三版
Function.prototype.call2 = function (context) {
  var context = context || window;
  context.fn = this;

  var args = [];
 
  for(var i = 1, len = arguments.length; i < len; i++) {
      args.push(arguments[i ]);
  }

  var result = context.fn(...args);

  delete context.fn
  return result;
}

// 测试一下
var value = 2;

var obj = {
  value: 1
}

function bar(name, age) {
  
  return {
      value: this.value,
      name: name,
      age: age
  }
}

bar.call(null); // 2

console.log(bar.call2(obj, 'kevin', 18));
// 1
// Object {
//    value: 1,
//    name: 'kevin',
//    age: 18
// }